package com.jack.jetpackapp.thread

import java.util.concurrent.*

/**
 * okhttp中的线程池 https://blog.csdn.net/m0_37700275/article/details/105044858
 */
object ThreadUtils {
    /**
     * 最大线程数
     */
    private val maxThread = Int.MAX_VALUE

    /**
     * 核心线程数
     */
    private val coreThread = 5

    /**
     * 闲置时间
     */
    private val idleTime = 60L

    private var threadPool: ThreadPoolExecutor? = null


    fun threadPool(@ThreadType type: Int): ThreadPoolExecutor? {
        if (threadPool == null) {
            val blockingQueue = when (type) {
                // SynchronousQueue每个插入操作必须等待另一个线程的移除操作，同样任何一个移除操作都等待另一个线程的插入操作。
                // 因此队列内部其实没有任何一个元素，或者说容量为0，严格说并不是一种容器，由于队列没有容量，因此不能调用peek等操作，
                // 因此只有移除元素才有元素，显然这是一种快速传递元素的方式，也就是说在这种情况下元素总是以最快的方式从插入者(生产者)传递给移除者(消费者),
                // 这在多任务队列中最快的处理任务方式。对于高频请求场景，无疑是最合适的
                ThreadType.TYPE_SIGN -> SynchronousQueue<Runnable>()
                else -> ArrayBlockingQueue(3)
            }
            threadPool = ThreadPoolExecutor(coreThread, maxThread, idleTime, TimeUnit.SECONDS, blockingQueue)
        }
        return threadPool
    }

    fun start(runnable: Runnable) {
        val future = threadPool?.submit(runnable)
    }
}